#include "ota_http.h"
#include <curl/curl.h>
#include <string.h>
#include "log/log.h"
#include <stdlib.h>

/**
 * @brief 接收响应数据的回调函数
 * 
 * @param contents 响应数据指针
 * @param size 
 * @param nmemb 
 * @param userp 传入的数据容器
 * @return size_t 
 */
size_t response_callback(void *contents, size_t size, size_t nmemb, void *userp) {
    char *res_data = (char *)contents;
    char *json_buf = (char *)userp;
    size_t len = size * nmemb;

    // 将响应数据拷贝到json_buf中
    memcpy(json_buf, res_data, len);
    // 添加一个字符串结束符
    json_buf[len] = '\0';
    
    return len;
}

char *ota_http_getJson(char *url)
{
    // 创建CURL对象
    CURL *curl = curl_easy_init();

    // 设置URL
    curl_easy_setopt(curl, CURLOPT_URL, url);
    // 设置接收响应数据的回调函数
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, response_callback);
    // 设置接收响应数据的容器 =》交给接收响应的回调函数
    char *json_buf = malloc(1024);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, json_buf);

    // 发请求
    CURLcode res = curl_easy_perform(curl);
    // 判断请求是否成功
    if (res != CURLE_OK) { // 请求失败了
        log_error("请求失败： %s", url);
        curl_easy_cleanup(curl);
        free(json_buf);
        return NULL; // 释放CURL对象
    }

    curl_easy_cleanup(curl); // 释放CURL对象

    return json_buf;
}

int ota_http_download(char *url, char *filename)
{

    // 创建CURL对象
    CURL *curl = curl_easy_init();

    // 设置URL
    curl_easy_setopt(curl, CURLOPT_URL, url);
    // 设置接收响应数据的回调函数
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, fwrite);
    // 设置接收响应数据的容器 =》交给接收响应的回调函数
    FILE *fp = fopen(filename, "wb"); // wb: 可以成块的写入模式
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);

    // 发请求
    CURLcode res = curl_easy_perform(curl);
    // 判断请求是否成功
    if (res != CURLE_OK) { // 请求失败了
        log_error("请求失败： %s", url);
        curl_easy_cleanup(curl); // 释放CURL对象
        fclose(fp);
        return -1; 
    }

    curl_easy_cleanup(curl); // 释放CURL对象
    fclose(fp);

    return 0;
}
